#pragma once
#include "OptionTag.h"

#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/vector_tie.hpp>
#include <boost/fusion/include/remove_if.hpp>
#include <boost/fusion/include/size.hpp>
#include <boost/fusion/include/at.hpp>
#include <assert.h>
#include "tkTypeTag.h"

using namespace boost;



namespace pyBind{

	

};//end of namespace  pyBind

namespace pyBind{  // CallProtkfunction

	template<typename Rtn,typename Fun,typename ArgSq,int n>
	struct CallProtkfunction_n
	{
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,0>
	{
		Rtn operator()(Fun pf,ArgSq& )
		{
			return pf(); 
		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,1>
	{

		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{
			//int size = fusion::result_of::size<ArgSq>::type::value; 

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			return pf(protkval_0); 
		}
	};

	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,2>
	{
		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{
			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			return pf(protkval_0,protkval_1); 

		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,3>
	{

		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{
			//int size = fusion::result_of::size<ArgSq>::type::value; 

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			return pf(protkval_0,protkval_1,protkval_2); 

		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,4>
	{
		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		typedef typename fusion::result_of::next<itT_2>::type itT_3;
		typedef typename fusion::result_of::deref<itT_3>::type valT_3;
		typedef typename remove_reference<valT_3>::type   valTr_3 ;
		typedef typename GetTkCallTypeT<valTr_3>::type tkvalT_3;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			itT_3 it_3 = fusion::next(it_2);
			valT_3 argTuple3 =  fusion::deref(it_3);
			tkvalT_3 protkval_3 = GetTkCallTypeT<valTr_3>::GetVal(argTuple3);

			return pf(protkval_0
				,protkval_1
				,protkval_2
				,protkval_3
				); 
		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,5>
	{
		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		typedef typename fusion::result_of::next<itT_2>::type itT_3;
		typedef typename fusion::result_of::deref<itT_3>::type valT_3;
		typedef typename remove_reference<valT_3>::type   valTr_3 ;
		typedef typename GetTkCallTypeT<valTr_3>::type tkvalT_3;

		typedef typename fusion::result_of::next<itT_3>::type itT_4;
		typedef typename fusion::result_of::deref<itT_4>::type valT_4;
		typedef typename remove_reference<valT_4>::type   valTr_4 ;
		typedef typename GetTkCallTypeT<valTr_4>::type tkvalT_4;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			itT_3 it_3 = fusion::next(it_2);
			valT_3 argTuple3 =  fusion::deref(it_3);
			tkvalT_3 protkval_3 = GetTkCallTypeT<valTr_3>::GetVal(argTuple3);

			itT_4 it_4 = fusion::next(it_3);
			valT_4 argTuple4 =  fusion::deref(it_4);
			tkvalT_4 protkval_4 = GetTkCallTypeT<valTr_4>::GetVal(argTuple4);
			//

			return pf(protkval_0
				,protkval_1
				,protkval_2
				,protkval_3
				,protkval_4
				); 
		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,6>
	{
		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		typedef typename fusion::result_of::next<itT_2>::type itT_3;
		typedef typename fusion::result_of::deref<itT_3>::type valT_3;
		typedef typename remove_reference<valT_3>::type   valTr_3 ;
		typedef typename GetTkCallTypeT<valTr_3>::type tkvalT_3;

		typedef typename fusion::result_of::next<itT_3>::type itT_4;
		typedef typename fusion::result_of::deref<itT_4>::type valT_4;
		typedef typename remove_reference<valT_4>::type   valTr_4 ;
		typedef typename GetTkCallTypeT<valTr_4>::type tkvalT_4;
		//
		typedef typename fusion::result_of::next<itT_4>::type itT_5;
		typedef typename fusion::result_of::deref<itT_5>::type valT_5;
		typedef typename remove_reference<valT_5>::type   valTr_5 ;
		typedef typename GetTkCallTypeT<valTr_5>::type tkvalT_5;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			itT_3 it_3 = fusion::next(it_2);
			valT_3 argTuple3 =  fusion::deref(it_3);
			tkvalT_3 protkval_3 = GetTkCallTypeT<valTr_3>::GetVal(argTuple3);

			itT_4 it_4 = fusion::next(it_3);
			valT_4 argTuple4 =  fusion::deref(it_4);
			tkvalT_4 protkval_4 = GetTkCallTypeT<valTr_4>::GetVal(argTuple4);
			//
			itT_5 it_5 = fusion::next(it_4);
			valT_5 argTuple5 =  fusion::deref(it_5);
			tkvalT_5 protkval_5 = GetTkCallTypeT<valTr_5>::GetVal(argTuple5);

			return pf(protkval_0
				,protkval_1
				,protkval_2
				,protkval_3
				,protkval_4
				,protkval_5
				); 
		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,7>
	{
		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		typedef typename fusion::result_of::next<itT_2>::type itT_3;
		typedef typename fusion::result_of::deref<itT_3>::type valT_3;
		typedef typename remove_reference<valT_3>::type   valTr_3 ;
		typedef typename GetTkCallTypeT<valTr_3>::type tkvalT_3;

		typedef typename fusion::result_of::next<itT_3>::type itT_4;
		typedef typename fusion::result_of::deref<itT_4>::type valT_4;
		typedef typename remove_reference<valT_4>::type   valTr_4 ;
		typedef typename GetTkCallTypeT<valTr_4>::type tkvalT_4;
		//
		typedef typename fusion::result_of::next<itT_4>::type itT_5;
		typedef typename fusion::result_of::deref<itT_5>::type valT_5;
		typedef typename remove_reference<valT_5>::type   valTr_5 ;
		typedef typename GetTkCallTypeT<valTr_5>::type tkvalT_5;

		typedef typename fusion::result_of::next<itT_5>::type itT_6;
		typedef typename fusion::result_of::deref<itT_6>::type valT_6;
		typedef typename remove_reference<valT_6>::type   valTr_6 ;
		typedef typename GetTkCallTypeT<valTr_6>::type tkvalT_6;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			itT_3 it_3 = fusion::next(it_2);
			valT_3 argTuple3 =  fusion::deref(it_3);
			tkvalT_3 protkval_3 = GetTkCallTypeT<valTr_3>::GetVal(argTuple3);

			itT_4 it_4 = fusion::next(it_3);
			valT_4 argTuple4 =  fusion::deref(it_4);
			tkvalT_4 protkval_4 = GetTkCallTypeT<valTr_4>::GetVal(argTuple4);
			//
			itT_5 it_5 = fusion::next(it_4);
			valT_5 argTuple5 =  fusion::deref(it_5);
			tkvalT_5 protkval_5 = GetTkCallTypeT<valTr_5>::GetVal(argTuple5);

			itT_6 it_6 = fusion::next(it_5);
			valT_6 argTuple6 =  fusion::deref(it_6);
			tkvalT_6 protkval_6 = GetTkCallTypeT<valTr_6>::GetVal(argTuple6);

			return pf(protkval_0
				,protkval_1
				,protkval_2
				,protkval_3
				,protkval_4
				,protkval_5
				,protkval_6
				); 
		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,8>
	{
		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		typedef typename fusion::result_of::next<itT_2>::type itT_3;
		typedef typename fusion::result_of::deref<itT_3>::type valT_3;
		typedef typename remove_reference<valT_3>::type   valTr_3 ;
		typedef typename GetTkCallTypeT<valTr_3>::type tkvalT_3;

		typedef typename fusion::result_of::next<itT_3>::type itT_4;
		typedef typename fusion::result_of::deref<itT_4>::type valT_4;
		typedef typename remove_reference<valT_4>::type   valTr_4 ;
		typedef typename GetTkCallTypeT<valTr_4>::type tkvalT_4;
		//
		typedef typename fusion::result_of::next<itT_4>::type itT_5;
		typedef typename fusion::result_of::deref<itT_5>::type valT_5;
		typedef typename remove_reference<valT_5>::type   valTr_5 ;
		typedef typename GetTkCallTypeT<valTr_5>::type tkvalT_5;

		typedef typename fusion::result_of::next<itT_5>::type itT_6;
		typedef typename fusion::result_of::deref<itT_6>::type valT_6;
		typedef typename remove_reference<valT_6>::type   valTr_6 ;
		typedef typename GetTkCallTypeT<valTr_6>::type tkvalT_6;

		typedef typename fusion::result_of::next<itT_6>::type itT_7;
		typedef typename fusion::result_of::deref<itT_7>::type valT_7;
		typedef typename remove_reference<valT_7>::type   valTr_7 ;
		typedef typename GetTkCallTypeT<valTr_7>::type tkvalT_7;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			itT_3 it_3 = fusion::next(it_2);
			valT_3 argTuple3 =  fusion::deref(it_3);
			tkvalT_3 protkval_3 = GetTkCallTypeT<valTr_3>::GetVal(argTuple3);

			itT_4 it_4 = fusion::next(it_3);
			valT_4 argTuple4 =  fusion::deref(it_4);
			tkvalT_4 protkval_4 = GetTkCallTypeT<valTr_4>::GetVal(argTuple4);
			//
			itT_5 it_5 = fusion::next(it_4);
			valT_5 argTuple5 =  fusion::deref(it_5);
			tkvalT_5 protkval_5 = GetTkCallTypeT<valTr_5>::GetVal(argTuple5);

			itT_6 it_6 = fusion::next(it_5);
			valT_6 argTuple6 =  fusion::deref(it_6);
			tkvalT_6 protkval_6 = GetTkCallTypeT<valTr_6>::GetVal(argTuple6);

			itT_7 it_7 = fusion::next(it_6);
			valT_7 argTuple7 =  fusion::deref(it_7);
			tkvalT_7 protkval_7 = GetTkCallTypeT<valTr_7>::GetVal(argTuple7);

			return pf(protkval_0
				,protkval_1
				,protkval_2
				,protkval_3
				,protkval_4
				,protkval_5
				,protkval_6
				,protkval_7
				); 
		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,9>
	{
		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		typedef typename fusion::result_of::next<itT_2>::type itT_3;
		typedef typename fusion::result_of::deref<itT_3>::type valT_3;
		typedef typename remove_reference<valT_3>::type   valTr_3 ;
		typedef typename GetTkCallTypeT<valTr_3>::type tkvalT_3;

		typedef typename fusion::result_of::next<itT_3>::type itT_4;
		typedef typename fusion::result_of::deref<itT_4>::type valT_4;
		typedef typename remove_reference<valT_4>::type   valTr_4 ;
		typedef typename GetTkCallTypeT<valTr_4>::type tkvalT_4;
		//
		typedef typename fusion::result_of::next<itT_4>::type itT_5;
		typedef typename fusion::result_of::deref<itT_5>::type valT_5;
		typedef typename remove_reference<valT_5>::type   valTr_5 ;
		typedef typename GetTkCallTypeT<valTr_5>::type tkvalT_5;

		typedef typename fusion::result_of::next<itT_5>::type itT_6;
		typedef typename fusion::result_of::deref<itT_6>::type valT_6;
		typedef typename remove_reference<valT_6>::type   valTr_6 ;
		typedef typename GetTkCallTypeT<valTr_6>::type tkvalT_6;

		typedef typename fusion::result_of::next<itT_6>::type itT_7;
		typedef typename fusion::result_of::deref<itT_7>::type valT_7;
		typedef typename remove_reference<valT_7>::type   valTr_7 ;
		typedef typename GetTkCallTypeT<valTr_7>::type tkvalT_7;

		typedef typename fusion::result_of::next<itT_7>::type itT_8;
		typedef typename fusion::result_of::deref<itT_8>::type valT_8;
		typedef typename remove_reference<valT_8>::type   valTr_8 ;
		typedef typename GetTkCallTypeT<valTr_8>::type tkvalT_8;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			itT_3 it_3 = fusion::next(it_2);
			valT_3 argTuple3 =  fusion::deref(it_3);
			tkvalT_3 protkval_3 = GetTkCallTypeT<valTr_3>::GetVal(argTuple3);

			itT_4 it_4 = fusion::next(it_3);
			valT_4 argTuple4 =  fusion::deref(it_4);
			tkvalT_4 protkval_4 = GetTkCallTypeT<valTr_4>::GetVal(argTuple4);
			//
			itT_5 it_5 = fusion::next(it_4);
			valT_5 argTuple5 =  fusion::deref(it_5);
			tkvalT_5 protkval_5 = GetTkCallTypeT<valTr_5>::GetVal(argTuple5);

			itT_6 it_6 = fusion::next(it_5);
			valT_6 argTuple6 =  fusion::deref(it_6);
			tkvalT_6 protkval_6 = GetTkCallTypeT<valTr_6>::GetVal(argTuple6);

			itT_7 it_7 = fusion::next(it_6);
			valT_7 argTuple7 =  fusion::deref(it_7);
			tkvalT_7 protkval_7 = GetTkCallTypeT<valTr_7>::GetVal(argTuple7);

			itT_8 it_8 = fusion::next(it_7);
			valT_8 argTuple8 =  fusion::deref(it_8);
			tkvalT_8 protkval_8 = GetTkCallTypeT<valTr_8>::GetVal(argTuple8);

			return pf(protkval_0
				,protkval_1
				,protkval_2
				,protkval_3
				,protkval_4
				,protkval_5
				,protkval_6
				,protkval_7
				,protkval_8
				); 
		}
	};
	template<typename Rtn,typename Fun,typename ArgSq>
	struct CallProtkfunction_n<Rtn,Fun,ArgSq,10>
	{

		//ArgSq is a vector reference of ArgTuple reference.
		typedef typename fusion::result_of::begin<ArgSq>::type itT_0;
		typedef typename fusion::result_of::deref<itT_0>::type valT_0;
		typedef typename remove_reference<valT_0>::type   valTr_0 ;
		typedef typename GetTkCallTypeT<valTr_0>::type tkvalT_0;

		typedef typename fusion::result_of::next<itT_0>::type itT_1;
		typedef typename fusion::result_of::deref<itT_1>::type valT_1;
		typedef typename remove_reference<valT_1>::type   valTr_1 ;
		typedef typename GetTkCallTypeT<valTr_1>::type tkvalT_1;

		typedef typename fusion::result_of::next<itT_1>::type itT_2;
		typedef typename fusion::result_of::deref<itT_2>::type valT_2;
		typedef typename remove_reference<valT_2>::type   valTr_2 ;
		typedef typename GetTkCallTypeT<valTr_2>::type tkvalT_2;

		typedef typename fusion::result_of::next<itT_2>::type itT_3;
		typedef typename fusion::result_of::deref<itT_3>::type valT_3;
		typedef typename remove_reference<valT_3>::type   valTr_3 ;
		typedef typename GetTkCallTypeT<valTr_3>::type tkvalT_3;

		typedef typename fusion::result_of::next<itT_3>::type itT_4;
		typedef typename fusion::result_of::deref<itT_4>::type valT_4;
		typedef typename remove_reference<valT_4>::type   valTr_4 ;
		typedef typename GetTkCallTypeT<valTr_4>::type tkvalT_4;
		 //
		typedef typename fusion::result_of::next<itT_4>::type itT_5;
		typedef typename fusion::result_of::deref<itT_5>::type valT_5;
		typedef typename remove_reference<valT_5>::type   valTr_5 ;
		typedef typename GetTkCallTypeT<valTr_5>::type tkvalT_5;

		typedef typename fusion::result_of::next<itT_5>::type itT_6;
		typedef typename fusion::result_of::deref<itT_6>::type valT_6;
		typedef typename remove_reference<valT_6>::type   valTr_6 ;
		typedef typename GetTkCallTypeT<valTr_6>::type tkvalT_6;

		typedef typename fusion::result_of::next<itT_6>::type itT_7;
		typedef typename fusion::result_of::deref<itT_7>::type valT_7;
		typedef typename remove_reference<valT_7>::type   valTr_7 ;
		typedef typename GetTkCallTypeT<valTr_7>::type tkvalT_7;

		typedef typename fusion::result_of::next<itT_7>::type itT_8;
		typedef typename fusion::result_of::deref<itT_8>::type valT_8;
		typedef typename remove_reference<valT_8>::type   valTr_8 ;
		typedef typename GetTkCallTypeT<valTr_8>::type tkvalT_8;

		typedef typename fusion::result_of::next<itT_8>::type itT_9;
		typedef typename fusion::result_of::deref<itT_9>::type valT_9;
		typedef typename remove_reference<valT_9>::type   valTr_9 ;
		typedef typename GetTkCallTypeT<valTr_9>::type tkvalT_9;

		Rtn operator()(Fun pf,ArgSq& m_args)
		{

			itT_0 it_0 = fusion::begin(m_args);
			valT_0 argTuple0 =  fusion::deref(it_0);
			tkvalT_0 protkval_0 = GetTkCallTypeT<valTr_0>::GetVal(argTuple0);

			itT_1 it_1 = fusion::next(it_0);
			valT_1 argTuple1 =  fusion::deref(it_1);
			tkvalT_1 protkval_1 = GetTkCallTypeT<valTr_1>::GetVal(argTuple1);

			itT_2 it_2 = fusion::next(it_1);
			valT_2 argTuple2 =  fusion::deref(it_2);
			tkvalT_2 protkval_2 = GetTkCallTypeT<valTr_2>::GetVal(argTuple2);

			itT_3 it_3 = fusion::next(it_2);
			valT_3 argTuple3 =  fusion::deref(it_3);
			tkvalT_3 protkval_3 = GetTkCallTypeT<valTr_3>::GetVal(argTuple3);

			itT_4 it_4 = fusion::next(it_3);
			valT_4 argTuple4 =  fusion::deref(it_4);
			tkvalT_4 protkval_4 = GetTkCallTypeT<valTr_4>::GetVal(argTuple4);
			//
			itT_5 it_5 = fusion::next(it_4);
			valT_5 argTuple5 =  fusion::deref(it_5);
			tkvalT_5 protkval_5 = GetTkCallTypeT<valTr_5>::GetVal(argTuple5);

			itT_6 it_6 = fusion::next(it_5);
			valT_6 argTuple6 =  fusion::deref(it_6);
			tkvalT_6 protkval_6 = GetTkCallTypeT<valTr_6>::GetVal(argTuple6);

			itT_7 it_7 = fusion::next(it_6);
			valT_7 argTuple7 =  fusion::deref(it_7);
			tkvalT_7 protkval_7 = GetTkCallTypeT<valTr_7>::GetVal(argTuple7);

			itT_8 it_8 = fusion::next(it_7);
			valT_8 argTuple8 =  fusion::deref(it_8);
			tkvalT_8 protkval_8 = GetTkCallTypeT<valTr_8>::GetVal(argTuple8);

			itT_9 it_9 = fusion::next(it_8);
			valT_9 argTuple9 =  fusion::deref(it_9);
			tkvalT_9 protkval_9 = GetTkCallTypeT<valTr_9>::GetVal(argTuple9);

			return pf(protkval_0
				,protkval_1
				,protkval_2
				,protkval_3
				,protkval_4
				,protkval_5
				,protkval_6
				,protkval_7
				,protkval_8
				,protkval_9
				); 
		}
	};

	template<typename Rtn,typename Fun,typename vecPyargs>
	struct CallProtkfunction:CallProtkfunction_n<Rtn,Fun,vecPyargs,fusion::result_of::size<vecPyargs>::type::value>
	{

	};

};//end CallProtkfunction